#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Create by zhang
# Create on 2022/6/25 19:50
from domain.report.entity.report_agg import ReportAgg


class OperatingCapacityRatios:
    """
    营运能力比率（Operating Capacity Ratios），或称为活力比率
    """
    def __init__(self, report:ReportAgg):
        self.report = report

    def accounts_receivable_turnover(self):
        """
        应收账款周转率（accounts receivable turnover）
        应收账款周转率 = 赊销净额/平均应收账款
        平均应收账款 = （年初 + 年末）/2
        """
        return self.report.accounts_receivable_turnover()

    def trade_credit_turnover(self):
        """
        商业债券周转率（trade credit turnover）
        商业债券周转率 = 赊销净额/(平均应收账款+平均应收票据)
        如果企业的应收票据占商业债券的比重较大，也就是说推动营业收入的主要是应收票据而非应收帐款，若仍用应收账款周转率指标来衡量公司应收账款的回收速度就会有失偏颇。
        """
        self.report.trade_credit_turnover()

    def average_collection_period(self):
        """
        平均收账期（average collection period）
        平均收账期 = 平均应收账款/平均日赊销额 = 365/应收账款周转率
        注意：
            1. 该公式假设企业的应收票据一般规模不大（因为应收票据也推动了赊销收入），在应收票据规模较大时，应该为商业债券周转率；
            2. 应收账款应该用减除坏账准备之前的”原值“金额（因为企业真正周转和回收的不是净值，而是原值）
            3. 在实施增值税的条件下，销售额的项目还应该乘以（1+增值税税率），这是因为债权中包括销项增值税。
        """
        return self.report.average_collection_period()

    def inventory_turnover(self, is_year:bool=False):
        """
        存货周转率（inventory turnover）
        存货周转率 = 营业成本/平均存货
        营业成本是对应的年、季、月营业成本
        平均存货是对应年、季、月平均存货
        需要根据企业的特点选择合适的存货计算周期，比如很多企业的存货存在季节性
        """
        return self.report.inventory_turnover(is_year)

    def inventory_turnover_days(self, is_year:bool=False):
        """
        存货周转天数（Inventory Turnover Days）,实际上是 存货周转率 的另一种表达方式
        存货周转天数 = 平均存货/平均日营业成本 = 365/存货周转率
        """
        return self.report.inventory_turnover_days(is_year)

    def business_cycle(self, is_year:bool=False):
        """
        企业营业周期 = 平均收账期 + 存货周转天数
        """
        return self.report.business_cycle(is_year)

    def operating_assets_turnover(self):
        """
        经营性资产周转率（operating assets turnover）
        经营性资产周转率 = 营业收入/平均经营性资产
        平均经营性资产 = （期初 + 期末）/2
        由于只有经营性资产才能带来营业收入，创造核心利润，因此，此指标可以考察企业经营性资产的周转效率，可以剔除投资性资产的干扰，
        更加客观、直接地反映企业管理层在自身的经营活动中对资产运营效率的管理能力。
        """
        return self.report.operating_assets_turnover()

    def fixed_assets_turnover(self):
        """
        固定资产周转率（fixed assets turnover）
        固定资产周转率 = 营业收入/平均固定资产原值
        平均固定资产原值 = （期初 + 期末）/2
        这个指标可以粗略地计算企业固定资产创造收入的能力反映企业管理层管理企业固定资产运营的能力。
        用原值计算出来的周转率可以恰当地反映企业对固定资产的运用状况。否则就会出现这样的情况：企业相邻两年的营业收入完全一样，但由于第二年企业计提
        了折旧而导致净值减少，结果用净值计算出来的周转率第二年高于第一年
        """
        self.report.fixed_assets_turnover()

    def total_assets_turnover(self):
        """
        总资产周转率（total assets turnover）
        总资产周转率 = 营业收入/平均总资产
        平均总资产 = （期初 + 期末）/2
        这个指标可以粗略地（因为资产的组成很复杂）计量企业资产创造收入的能力，反映企业管理层管理企业资产运营的能力
        """
        return self.report.total_assets_turnover()